library(png)
## First consolidate the available files into a single table
    
      path <- "~/Box Sync/Four model compare/Module 2"
           
     
           setwd(path)
    myfiles_full <- list.dirs()
    analyze_this_many <- length(myfiles_full)
    
    available_files <- matrix(NA, 1, 1)
    
        
    for(i in 1: analyze_this_many){
    available_files <- rbind(available_files , as.matrix(list.files(myfiles_full[i], full.names = TRUE)))
    }
    dim(available_files)
    
    split.file.name <- strsplit(available_files[10], split = "_") 
    
    
    
 
available <- list.files()
files <- matrix(rep(NA, 62), length(available), 62)
dim(files)
i <- 10


for(i in 1:length(available)){
load(available[i])
name <- unlist(strsplit(available[i], split="_"))
files[i,] <- c(as.vector(matrix(name, 1,35)),matrix(Sim_statistics[[1]], 1, 27))

}


colnames(files) <-  c(

    NA,
    "background_takeover_type" ,
    NA,
    "replicate",
    NA,
    "Model_type",
    rep(NA,2),
    "speciation_of_Env_NonD",
    "speciation_of_Env_D",
    "speciation_of_For",
    "speciation_of_Dom",
    NA,
    "extinction_of_Env_NonD",
    "extinction_of_Env_D",
    "extinction_of_For",
    "extinction_of_Dom",
    NA,
    "P.diffusion_Target_forager",
    "P.diffusion_Target_domesticator",
    "P.diffusion_Source_forager",
    "P.diffusion_Source_domesticator",
    NA,
    "P.takeover_Target_forager",
    "P.takeover_Target_domesticator",
    "P.takeover_Source_forager",
    "P.takeover_Source_domesticator",
    NA,
    "arisal_of_Env_NonD",
    "arisal_of_Env_D",
    "arisal_of_For",
    "arisal_of_Dom",
    
    NA, 
    "timesteps", 
    NA,
        
    "number_of_branches",
    "Pylo_diversity_is_sum_of_BL",
    "average_phylogenetic_diversity_is_mean_of_BL",
    "variance_Pylo_diversity_is_variance_of_BL",

    "F_quadratic_entropy_is_sum_of_PD",
    "Mean_pairwise_distance",
    "variance_pairwise_distance",

    "Evolutionary_distinctiveness_sum",
    "mean_Phylogenetic_isolation",
    "variance_Phylogenetic_isolation",

    "gamma",
    "gamma_p_value",
    "speciation_rate",
    "extinction_rate",
    "extinction_per_speciation",
    "speciation_minus_extinction",
    "trait_1_speciation",
    "trait_2_speciation" ,
    "trait_1_extinction" ,
    "trait_2_extinction" ,
    "transition_from_trait_1_to_2" ,
    "transition_from_trait_2_to_1" ,
    "transition_rate_ratio_1to2_over_2to1" ,
    "Phylogenetic_signal",
    "spatial.tests.fora",
    "spatial.tests.dom",
    "prevalence"
    
    
  )

results_table <- as.data.frame(files)
head(results_table)
dim(results_table)
Concatenated_data <- results_table
save(Concatenated_data, file="~/Desktop/Four_model_compare_results.Rdata")

one <- subset(results_table, Model_type=="01" )
two <- subset(results_table, Model_type=="02" )
three <- subset(results_table, Model_type=="03" )
four <- subset(results_table, Model_type=="04" )
crop <- min(length(one[,1]),
length(two[,1]),
length(three[,1]),
length(four[,1]))
one <- one[1:crop,]
two <- two[1:crop,]
three <- three[1:crop,]
four <- four[1:crop,]

Concatenated_data <- rbind(one, two, three, four)
dim(Concatenated_data)
save(Concatenated_data, file="~/Desktop/Four_model_compare_results.Rdata")
crop
## First consolidate the available files into a single table
    
      path <- "~/Box Sync/Four model compare/Module 2 extinct"
           
     
           setwd(path)
Error in setwd(path) : cannot change working directory
load('~/Box Sync/colliding ranges/Simulations_humans/Results/Four_model_compare_results_extinct.Rdata')
extinct <- Concatenated_data
load('~/Box Sync/colliding ranges/Simulations_humans/Results/Four_model_compare_results.Rdata')
extant <- Concatenated_data
names(extinct)
 [1] NA                                            
 [2] "background_takeover_type"                    
 [3] NA                                            
 [4] "replicate"                                   
 [5] NA                                            
 [6] "Model_type"                                  
 [7] NA                                            
 [8] NA                                            
 [9] "speciation_of_Env_NonD"                      
[10] "speciation_of_Env_D"                         
[11] "speciation_of_For"                           
[12] "speciation_of_Dom"                           
[13] NA                                            
[14] "extinction_of_Env_NonD"                      
[15] "extinction_of_Env_D"                         
[16] "extinction_of_For"                           
[17] "extinction_of_Dom"                           
[18] NA                                            
[19] "P.diffusion_Target_forager"                  
[20] "P.diffusion_Target_domesticator"             
[21] "P.diffusion_Source_forager"                  
[22] "P.diffusion_Source_domesticator"             
[23] NA                                            
[24] "P.takeover_Target_forager"                   
[25] "P.takeover_Target_domesticator"              
[26] "P.takeover_Source_forager"                   
[27] "P.takeover_Source_domesticator"              
[28] NA                                            
[29] "arisal_of_Env_NonD"                          
[30] "arisal_of_Env_D"                             
[31] "arisal_of_For"                               
[32] "arisal_of_Dom"                               
[33] NA                                            
[34] "timesteps"                                   
[35] NA                                            
[36] "number_of_branches"                          
[37] "Pylo_diversity_is_sum_of_BL"                 
[38] "average_phylogenetic_diversity_is_mean_of_BL"
[39] "variance_Pylo_diversity_is_variance_of_BL"   
[40] "F_quadratic_entropy_is_sum_of_PD"            
[41] "Mean_pairwise_distance"                      
[42] "variance_pairwise_distance"                  
[43] "Evolutionary_distinctiveness_sum"            
[44] "mean_Phylogenetic_isolation"                 
[45] "variance_Phylogenetic_isolation"             
[46] "gamma"                                       
[47] "gamma_p_value"                               
[48] "speciation_rate"                             
[49] "extinction_rate"                             
[50] "extinction_per_speciation"                   
[51] "speciation_minus_extinction"                 
[52] "trait_1_speciation"                          
[53] "trait_2_speciation"                          
[54] "trait_1_extinction"                          
[55] "trait_2_extinction"                          
[56] "transition_from_trait_1_to_2"                
[57] "transition_from_trait_2_to_1"                
[58] "transition_rate_ratio_1to2_over_2to1"        
[59] "Phylogenetic_signal"                         
[60] "spatial.tests.fora"                          
[61] "spatial.tests.dom"                           
[62] "prevalence"                                  
names(extant)
 [1] NA                                            
 [2] "background_takeover_type"                    
 [3] "NA.1"                                        
 [4] "replicate"                                   
 [5] "NA.2"                                        
 [6] "Model_type"                                  
 [7] "NA.3"                                        
 [8] "NA.4"                                        
 [9] "speciation_of_Env_NonD"                      
[10] "speciation_of_Env_D"                         
[11] "speciation_of_For"                           
[12] "speciation_of_Dom"                           
[13] "NA.5"                                        
[14] "extinction_of_Env_NonD"                      
[15] "extinction_of_Env_D"                         
[16] "extinction_of_For"                           
[17] "extinction_of_Dom"                           
[18] "NA.6"                                        
[19] "P.diffusion_Target_forager"                  
[20] "P.diffusion_Target_domesticator"             
[21] "P.diffusion_Source_forager"                  
[22] "P.diffusion_Source_domesticator"             
[23] "NA.7"                                        
[24] "P.takeover_Target_forager"                   
[25] "P.takeover_Target_domesticator"              
[26] "P.takeover_Source_forager"                   
[27] "P.takeover_Source_domesticator"              
[28] "NA.8"                                        
[29] "arisal_of_Env_NonD"                          
[30] "arisal_of_Env_D"                             
[31] "arisal_of_For"                               
[32] "arisal_of_Dom"                               
[33] "NA.9"                                        
[34] "timesteps"                                   
[35] "NA.10"                                       
[36] "number_of_branches"                          
[37] "Pylo_diversity_is_sum_of_BL"                 
[38] "average_phylogenetic_diversity_is_mean_of_BL"
[39] "variance_Pylo_diversity_is_variance_of_BL"   
[40] "F_quadratic_entropy_is_sum_of_PD"            
[41] "Mean_pairwise_distance"                      
[42] "variance_pairwise_distance"                  
[43] "Evolutionary_distinctiveness_sum"            
[44] "mean_Phylogenetic_isolation"                 
[45] "variance_Phylogenetic_isolation"             
[46] "gamma"                                       
[47] "gamma_p_value"                               
[48] "speciation_rate"                             
[49] "extinction_rate"                             
[50] "extinction_per_speciation"                   
[51] "speciation_minus_extinction"                 
[52] "trait_1_speciation"                          
[53] "trait_2_speciation"                          
[54] "trait_1_extinction"                          
[55] "trait_2_extinction"                          
[56] "transition_from_trait_1_to_2"                
[57] "transition_from_trait_2_to_1"                
[58] "transition_rate_ratio_1to2_over_2to1"        
[59] "Phylogenetic_signal"                         
[60] "spatial.tests.fora"                          
[61] "spatial.tests.dom"                           
[62] "prevalence"                                  
for(i in c(9,10,11,12,14,15,16,17,19,20,21,22,24,25,26,27,29,30,31,32)){
    extinct[which(is.nan(as.numeric(as.character(extinct[, i]))) == TRUE), i] <- NA
}
for(i in c(9,10,11,12,14,15,16,17,19,20,21,22,24,25,26,27,29,30,31,32)){
    extant[which(is.nan(as.numeric(as.character(extant[, i]))) == TRUE), i] <- NA
}
i <- 19
for(i in c(20,21,24,25,26,27)){
    extinct[which(as.numeric(as.character(extinct[, i])) == 0), i] <- NA
}
for(i in c(20,21,24,25,26,27)){
    extant[which(as.numeric(as.character(extant[, i])) == 0), i] <- NA
}
xlimit <- c(0,1)
ylimit <- c(0,600)
maincex <- 0.9
png(file="Global_success_rate_per_parameter.png", width=8.5, height=11, units="in", res=300)
par(mfrow=c(5,4), mar=c(3,3,3,0))
hist(as.numeric(as.character(extinct[,9])), main="speciation of F in F env", col=adjustcolor("firebrick", alpha=0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[,9])), main="speciation of F in F env", col=adjustcolor("cornflowerblue", alpha=0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
hist(as.numeric(as.character(extinct[,10])), main="speciation of D in F env", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[,10])), main="speciation of D in F env", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
hist(as.numeric(as.character(extinct[,11])), main="speciation of F in D env", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[,11])), main="speciation of F in D env", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
hist(as.numeric(as.character(extinct[,12])), main="speciation of D in D env", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[,12])), main="speciation of D in D env", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
#######
hist(as.numeric(as.character(extinct[, 14])), main="extinction of F in F env", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[, 14])), main="extinction of F in F env", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
hist(as.numeric(as.character(extinct[, 15])), main="extinction of D in F env", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[, 15])), main="extinction of D in F env", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
hist(as.numeric(as.character(extinct[, 16])), main="extinction of F in D env", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[, 16])), main="extinction of F in D env", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
hist(as.numeric(as.character(extinct[, 17])), main="extinction of D in D env", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[, 17])), main="extinction of D in D env", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
######
hist(as.numeric(as.character(extinct[, 29])), main="arisal of F in F env", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[, 29])), main="arisal of F in F env", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
hist(as.numeric(as.character(extinct[, 30])), main="arisal of D in F env", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[, 30])), main="arisal of D in F env", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
hist(as.numeric(as.character(extinct[, 31])), main="arisal of F in D env", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[, 31])), main="arisal of F in D env", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
hist(as.numeric(as.character(extinct[, 32])), main="arisal of D in D env", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[, 32])), main="arisal of D in D env", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
######
hist(as.numeric(as.character(extinct[, 19])), main="NOPE -- Diffusion: source F, target F", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= c(0,18000), cex.main= maincex)
hist(as.numeric(as.character(extant[, 19])), main="NOPE -- Diffusion: source F, target F", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= c(0,18000), cex.main= maincex, add=TRUE)
hist(as.numeric(as.character(extinct[, 20])), main="Diffusion: source D, target F", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[, 20])), main="Diffusion: source D, target F", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
hist(as.numeric(as.character(extinct[, 21])), main="Diffusion: source F, target D", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[, 21])), main="Diffusion: source F, target D", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
hist(as.numeric(as.character(extinct[, 22])), main="NOPE -- Diffusion: source D, target D", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= c(0,18000), cex.main= maincex)
hist(as.numeric(as.character(extant[, 22])), main="NOPE -- Diffusion: source D, target D", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= c(0,18000), cex.main= maincex, add=TRUE)
####
hist(as.numeric(as.character(extinct[, 24])), main="Takeover: source F, target F", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[, 24])), main="Takeover: source F, target F", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
hist(as.numeric(as.character(extinct[, 25])), main="Takeover: source D, target F", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[, 25])), main="Takeover: source D, target F", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
hist(as.numeric(as.character(extinct[, 26])), main="Takeover: source F, target D", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[, 26])), main="Takeover: source F, target D", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
hist(as.numeric(as.character(extinct[, 27])), main="Takeover: source D, target D", col=adjustcolor("firebrick", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex)
hist(as.numeric(as.character(extant[, 27])), main="Takeover: source D, target D", col=adjustcolor("cornflowerblue", alpha= 0.7), breaks=100, border=NA, xlim= xlimit, ylim= ylimit, cex.main= maincex, add=TRUE)
dev.off()
null device 
          1 
png(file="extiction minus extant per outcome.png", width=8.5, height=11, units="in", res=300)
par(mfrow=c(3,1))
plot(as.numeric(as.character(extinct[,9])), as.numeric(as.character(extinct[,14])), xlab="speciation", ylab="extinction", col= adjustcolor("firebrick", alpha=0.2), pch=19, cex=0.6, ylim=c(0,1))
plot(as.numeric(as.character(extant[,9])), as.numeric(as.character(extant[,14])), xlab="speciation", ylab="extinction", col= adjustcolor("cornflowerblue", alpha=0.2), pch=19, cex=0.6, ylim=c(0,1))
plot(as.numeric(as.character(extinct[,9])), as.numeric(as.character(extinct[,14])), xlab="speciation", ylab="extinction", col= adjustcolor("firebrick", alpha=0.2), pch=19, cex=0.6, ylim=c(0,1))
points(as.numeric(as.character(extant[,9])), as.numeric(as.character(extant[,14])), xlab="speciation", ylab="extinction", col= adjustcolor("cornflowerblue", alpha=0.2), pch=19, cex=0.6)
dev.off()
null device 
          1 
load('~/Box Sync/colliding ranges/Simulations_humans/Available trees/real.analysis.RData')
#Concatenated_data <- Concatenated_data[Concatenated_data[, 2] == "stats.no.bTO", ]
#Concatenated_data <- Concatenated_data[Concatenated_data[, 6] != "05", ]
# Concatenated_data[, 6] <- as.numeric(Concatenated_data[, 6])
# # Concatenated_data[original[, 2] == "background_takeover", 6] <-  Concatenated_data[original[, 2] == "background_takeover", 6] + 4
Concatenated_data[, 6] <- factor(Concatenated_data[, 6])
head(Concatenated_data)
names(Concatenated_data)
 [1] NA                                            
 [2] "background_takeover_type"                    
 [3] "NA.1"                                        
 [4] "replicate"                                   
 [5] "NA.2"                                        
 [6] "Model_type"                                  
 [7] "NA.3"                                        
 [8] "NA.4"                                        
 [9] "speciation_of_Env_NonD"                      
[10] "speciation_of_Env_D"                         
[11] "speciation_of_For"                           
[12] "speciation_of_Dom"                           
[13] "NA.5"                                        
[14] "extinction_of_Env_NonD"                      
[15] "extinction_of_Env_D"                         
[16] "extinction_of_For"                           
[17] "extinction_of_Dom"                           
[18] "NA.6"                                        
[19] "P.diffusion_Target_forager"                  
[20] "P.diffusion_Target_domesticator"             
[21] "P.diffusion_Source_forager"                  
[22] "P.diffusion_Source_domesticator"             
[23] "NA.7"                                        
[24] "P.takeover_Target_forager"                   
[25] "P.takeover_Target_domesticator"              
[26] "P.takeover_Source_forager"                   
[27] "P.takeover_Source_domesticator"              
[28] "NA.8"                                        
[29] "arisal_of_Env_NonD"                          
[30] "arisal_of_Env_D"                             
[31] "arisal_of_For"                               
[32] "arisal_of_Dom"                               
[33] "NA.9"                                        
[34] "timesteps"                                   
[35] "NA.10"                                       
[36] "number_of_branches"                          
[37] "Pylo_diversity_is_sum_of_BL"                 
[38] "average_phylogenetic_diversity_is_mean_of_BL"
[39] "variance_Pylo_diversity_is_variance_of_BL"   
[40] "F_quadratic_entropy_is_sum_of_PD"            
[41] "Mean_pairwise_distance"                      
[42] "variance_pairwise_distance"                  
[43] "Evolutionary_distinctiveness_sum"            
[44] "mean_Phylogenetic_isolation"                 
[45] "variance_Phylogenetic_isolation"             
[46] "gamma"                                       
[47] "gamma_p_value"                               
[48] "speciation_rate"                             
[49] "extinction_rate"                             
[50] "extinction_per_speciation"                   
[51] "speciation_minus_extinction"                 
[52] "trait_1_speciation"                          
[53] "trait_2_speciation"                          
[54] "trait_1_extinction"                          
[55] "trait_2_extinction"                          
[56] "transition_from_trait_1_to_2"                
[57] "transition_from_trait_2_to_1"                
[58] "transition_rate_ratio_1to2_over_2to1"        
[59] "Phylogenetic_signal"                         
[60] "spatial.tests.fora"                          
[61] "spatial.tests.dom"                           
[62] "prevalence"                                  
PCAdata <- Concatenated_data[, -(1:35)]
PCAdata <- PCAdata[, -12]
PCAdata <- apply(PCAdata, 2, as.numeric)
remove <- apply(is.na(PCAdata), 1, any)
PCAdata <- PCAdata[!remove, ]
# Predictions
library(randomForest)
data.analysis.comp2 <- data.frame("Model" = as.factor(Concatenated_data[!remove, 6]),
                                  PCAdata)
data.analysis.comp2$sprate <- data.analysis.comp2$trait_1_speciation/data.analysis.comp2$trait_2_speciation
data.analysis.comp2$extrate <- data.analysis.comp2$trait_1_extinction/data.analysis.comp2$trait_2_extinction
#load("Real_phy/real.analysis.RData")
a <- as.data.frame(real.analysis$results_summary_of_single_value_outputs)
a$sprate <- a$trait_1_speciation / a$trait_2_speciation
a$extrate <- a$trait_1_extinction / a$trait_2_extinction
data.analysis.comp3 <- data.analysis.comp2[, -c(2, 13:14, 16:20)]
#data.analysis.comp3 <- data.analysis.comp3[data.analysis.comp3$Model %in% 1:4, ]
#data.analysis.comp3$Model <- factor(data.analysis.comp3$Model)
#sub <- unlist(lapply(as.list(c(1:4)), function(x, y) {
#  sample(which(y$Model == x), min(table(data.analysis.comp3$Model)))},
#  y = data.analysis.comp3))
# data.analysis.comp3 <- data.analysis.comp3[sub, ]
fun <- function(x, y, per = .33) {sample(which(y$Model == x), round(table(y$Model)[1]*per))}
sub.test <- unlist(lapply(as.list(paste0(0, c(1:4))), fun,
                          y = data.analysis.comp3))
test2 <- data.analysis.comp3[sub.test, 2:ncol(data.analysis.comp3)]
test1 <- data.analysis.comp3[sub.test, 1]
train <- data.analysis.comp3[-sub.test, ]
(fit <- randomForest(Model ~ ., data=train, xtest = test2, ytest = test1, 
                    importance=TRUE, ntree=2400, keep.forest = TRUE))

Call:
 randomForest(formula = Model ~ ., data = train, xtest = test2,      ytest = test1, importance = TRUE, ntree = 2400, keep.forest = TRUE) 
               Type of random forest: classification
                     Number of trees: 2400
No. of variables tried at each split: 4

        OOB estimate of  error rate: 42.23%
Confusion matrix:
    01  02  03  04 class.error
01 956 150 377  77   0.3871795
02 204 704 149 457   0.5350066
03 308  52 924 229   0.3892928
04  67 187 277 883   0.3755304
                Test set error rate: 42.42%
Confusion matrix:
    01  02  03  04 class.error
01 461  82 187  38   0.3997396
02 108 361  84 215   0.5299479
03 142  23 485 118   0.3684896
04  33 127 146 462   0.3984375
predictions <- predict(fit, 
                       a,
                       type="prob")
plot(fit, ylim=c(0,1))

labs <- c("Basic", "+Diffusion", "+Takeover", "+Diffusion +Takeover")
# bar plot
png("Prob_aus.png", width = 25, height = 25, res = 300, units = "in")
par(mar = c(8, 8, 1, 1))
pred <- setNames(as.numeric(predictions), labs)
cols <- rev(c("darkgreen", "red", "blue", "darkorange1"))
barplot(pred, col = cols, ylab = "Proability", cex.lab = 3, cex.names = 2)
dev.off()
null device 
          1 
prop
          01        02        03        04
01 62.280130 13.723696 21.829763  4.678007
02 13.289902 64.409881  8.627678 27.764277
03 20.065147  4.757548 53.503185 13.912515
04  4.364821 17.108875 16.039375 53.645200
importance(fit)
                                                   01        02        03
Pylo_diversity_is_sum_of_BL                  36.27731 26.313769 38.900228
average_phylogenetic_diversity_is_mean_of_BL 42.47717 32.482005 38.519904
variance_Pylo_diversity_is_variance_of_BL    42.15824 16.661635  9.266383
F_quadratic_entropy_is_sum_of_PD             24.95204 19.851036 36.048651
Mean_pairwise_distance                       31.03797 25.728248 33.157743
variance_pairwise_distance                   31.43706 29.867035 34.057818
Evolutionary_distinctiveness_sum             36.73711 26.605041 37.480353
mean_Phylogenetic_isolation                  40.52562 33.527197 41.801064
variance_Phylogenetic_isolation              24.57867  8.325148 37.260442
gamma                                        26.36037 21.591877 63.126688
extinction_per_speciation                     7.99549 41.950330 54.475002
transition_from_trait_1_to_2                 22.53100 22.856490 41.900317
transition_from_trait_2_to_1                 33.37167 33.715083 45.090491
transition_rate_ratio_1to2_over_2to1         50.20133 36.600927 35.430284
Phylogenetic_signal                          64.80645 43.118360 53.232738
spatial.tests.fora                           43.20987 86.600931 89.746230
spatial.tests.dom                            82.03166 30.318014 47.558336
prevalence                                   54.14112  9.616747 35.927323
sprate                                       41.34870 28.286586 85.062626
extrate                                      28.88581 24.078228 21.624649
                                                   04 MeanDecreaseAccuracy
Pylo_diversity_is_sum_of_BL                  45.76293             62.84990
average_phylogenetic_diversity_is_mean_of_BL 32.73694             67.29494
variance_Pylo_diversity_is_variance_of_BL    27.05678             54.35726
F_quadratic_entropy_is_sum_of_PD             43.18824             68.31908
Mean_pairwise_distance                       42.30806             63.22960
variance_pairwise_distance                   22.73712             60.82865
Evolutionary_distinctiveness_sum             44.98800             63.01409
mean_Phylogenetic_isolation                  33.38172             68.79250
variance_Phylogenetic_isolation              22.99055             49.94780
gamma                                        51.68400             89.28718
extinction_per_speciation                    54.09510             75.50858
transition_from_trait_1_to_2                 41.11630             58.91197
transition_from_trait_2_to_1                 40.76374             67.48847
transition_rate_ratio_1to2_over_2to1         42.40223             85.56456
Phylogenetic_signal                          40.17895             85.09066
spatial.tests.fora                           76.44656            125.15481
spatial.tests.dom                            53.97271            104.59956
prevalence                                   58.91447             79.90220
sprate                                       36.41170             92.93119
extrate                                      36.77120             58.20976
                                             MeanDecreaseGini
Pylo_diversity_is_sum_of_BL                          210.2330
average_phylogenetic_diversity_is_mean_of_BL         182.1725
variance_Pylo_diversity_is_variance_of_BL            164.4793
F_quadratic_entropy_is_sum_of_PD                     185.9903
Mean_pairwise_distance                               206.3388
variance_pairwise_distance                           183.6735
Evolutionary_distinctiveness_sum                     207.9225
mean_Phylogenetic_isolation                          184.8331
variance_Phylogenetic_isolation                      167.5043
gamma                                                213.3865
extinction_per_speciation                            251.9260
transition_from_trait_1_to_2                         255.1930
transition_from_trait_2_to_1                         262.6217
transition_rate_ratio_1to2_over_2to1                 211.2503
Phylogenetic_signal                                  303.1266
spatial.tests.fora                                   395.4726
spatial.tests.dom                                    250.7786
prevalence                                           226.0943
sprate                                               244.7882
extrate                                              190.3293
# Variables importance
imp <- importance(fit)
imp <- apply(imp, 2, function(x) (x - min(x))/(max(x) - min(x)))
imp <- imp[sort(imp[, 5], index.return = TRUE, decreasing = TRUE)$ix, ]
names <- rownames(imp)
names[names == "spatial.tests.fora"] <- "Space F"
names[names == "spatial.tests.dom"] <- "Space D"
names[names == "sprate"] <- "Sp(ratio)"
names[names == "transition_from_trait_1_to_2"] <- "TR(1-2)"
names[names == "transition_from_trait_2_to_1"] <- "TR(2-1)"
names[names == "Phylogenetic_signal"] <- "PhySig(D)"
names[names == "Evolutionary_distinctiveness_sum"] <- "EDsum"
names[names == "Pylo_diversity_is_sum_of_BL"] <- "PDsum"
names[names == "transition_rate_ratio_1to2_over_2to1"] <- "TR(ratio)"
names[names == "gamma"] <- "Gamma"
names[names == "mean_Phylogenetic_isolation"] <- "MPI"
names[names == "extrate"] <- "Ext(ratio)"
names[names == "average_phylogenetic_diversity_is_mean_of_BL"] <- "PDmean"
names[names == "extinction_per_speciation"] <- "DR"
names[names == "variance_Phylogenetic_isolation"] <- "VPI"
names[names == "F_quadratic_entropy_is_sum_of_PD"] <- "F"
names[names == "Mean_pairwise_distance"] <- "MPD"
names[names == "variance_Pylo_diversity_is_variance_of_BL"] <- "PDvar"
names[names == "variance_pairwise_distance"] <- "VPD"
png("var_import_all.png", width = 25, height = 25, unit="in", res=300)
par(mar = c(10, 18, 1, 1))
plot(x = rev(imp[, 5]), y = 1:nrow(imp), type = "l", yaxt = "n", 
     ylab = "", xlab = "Variable Importance",
     xlim = c(0, 1), lwd = 2, cex.lab = 4)
for (i in 1:nrow(imp)) {
  abline(h = i, lty = 3, col = "gray80")
}
abline(v = seq(0, 1, 1/19), lty = 3, col = "gray80")
lines(x = rev(imp[, 4]), y = 1:nrow(imp), col = "darkgreen", lwd = 2)
lines(x = rev(imp[, 3]), y = 1:nrow(imp), col = "red", lwd = 2)
lines(x = rev(imp[, 2]), y = 1:nrow(imp), col = "blue", lwd = 2)
lines(x = rev(imp[, 1]), y = 1:nrow(imp), col = "darkorange1", lwd = 2)
lines(x = rev(imp[, 5]), y = 1:nrow(imp), lwd = 3)
points(x = rev(imp[, 4]), y = 1:nrow(imp), col = "darkgreen", cex = 2)
points(x = rev(imp[, 3]), y = 1:nrow(imp), col = "red", cex = 2)
points(x = rev(imp[, 2]), y = 1:nrow(imp), col = "blue", cex = 2)
points(x = rev(imp[, 1]), y = 1:nrow(imp), col = "darkorange1", cex = 2)
points(x = rev(imp[, 5]), y = 1:nrow(imp), pch = 20, cex = 3)
text(y = 1:nrow(imp), x = par("usr")[1] - .17, labels = rev(names),
     srt = 0, pos = 4, xpd = T, cex = 4)
dev.off()
null device 
          1 
par(mfrow=c(2,3))
# Box plots
boxplot(spatial.tests.fora ~ Model, data = data.analysis.comp3)
abline(h = a$spatial.tests.fora, col = "red", lty = 2)
boxplot(spatial.tests.dom ~ Model, data = data.analysis.comp3)
abline(h = a$spatial.tests.fora, col = "red", lty = 2)
boxplot(log(sprate) ~ Model, data = data.analysis.comp3, ylim = c(-10, 10))
abline(h = log(a$sprate), col = "red", lty = 2)
boxplot(log(extrate) ~ Model, data = data.analysis.comp3, ylim = c(-10, 10))
abline(h = log(a$extrate), col = "red", lty = 2)
boxplot(log(transition_rate_ratio_1to2_over_2to1) ~ Model, data = data.analysis.comp3)
abline(h = log(a$sprate), col = "red", lty = 2)
boxplot(Phylogenetic_signal ~ Model, data = data.analysis.comp3, ylim = c(0, 1))
abline(h = a$Phylogenetic_signal, col = "red", lty = 2)

LS0tCnRpdGxlOiAiRC1wbGFjZSBGQVJNIGRvY3VtZW50YXRpb246IE1vZHVsZSAzIgphdXRob3I6ICJUeSBUdWZmLCBCcnVubyBWaWxlbGEsIGFuZCBDYXJsb3MgQm90ZXJvIgpkYXRlOiAncHJvamVjdCBiZWdhbjogMTUgTWF5IDIwMTYsIGRvY3VtZW50IHVwZGF0ZWQ6IGByIHN0cmZ0aW1lKFN5cy50aW1lKCksIGZvcm1hdAogID0gIiVkICVCICVZIilgJwpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIGh0bWxfZG9jdW1lbnQ6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0CmJpYmxpb2dyYXBoeTogRkFSTSBwYWNrYWdlLmJpYgotLS0KYGBge3J9CmxpYnJhcnkocG5nKQpgYGAKCgoKYGBge3J9CiMjIEZpcnN0IGNvbnNvbGlkYXRlIHRoZSBhdmFpbGFibGUgZmlsZXMgaW50byBhIHNpbmdsZSB0YWJsZQogICAgCiAgICAgIHBhdGggPC0gIn4vQm94IFN5bmMvRm91ciBtb2RlbCBjb21wYXJlL01vZHVsZSAyIgogICAgICAgICAgIAogICAgIAogICAgICAgICAgIHNldHdkKHBhdGgpCiAgICBteWZpbGVzX2Z1bGwgPC0gbGlzdC5kaXJzKCkKICAgIGFuYWx5emVfdGhpc19tYW55IDwtIGxlbmd0aChteWZpbGVzX2Z1bGwpCiAgICAKICAgIGF2YWlsYWJsZV9maWxlcyA8LSBtYXRyaXgoTkEsIDEsIDEpCiAgICAKICAgICAgICAKICAgIGZvcihpIGluIDE6IGFuYWx5emVfdGhpc19tYW55KXsKICAgIGF2YWlsYWJsZV9maWxlcyA8LSByYmluZChhdmFpbGFibGVfZmlsZXMgLCBhcy5tYXRyaXgobGlzdC5maWxlcyhteWZpbGVzX2Z1bGxbaV0sIGZ1bGwubmFtZXMgPSBUUlVFKSkpCiAgICB9CiAgICBkaW0oYXZhaWxhYmxlX2ZpbGVzKQogICAgCiAgICBzcGxpdC5maWxlLm5hbWUgPC0gc3Ryc3BsaXQoYXZhaWxhYmxlX2ZpbGVzWzEwXSwgc3BsaXQgPSAiXyIpIAogICAgCiAgICAKICAgIAogCmF2YWlsYWJsZSA8LSBsaXN0LmZpbGVzKCkKZmlsZXMgPC0gbWF0cml4KHJlcChOQSwgNjIpLCBsZW5ndGgoYXZhaWxhYmxlKSwgNjIpCmRpbShmaWxlcykKaSA8LSAxMAoKCmZvcihpIGluIDE6bGVuZ3RoKGF2YWlsYWJsZSkpewpsb2FkKGF2YWlsYWJsZVtpXSkKbmFtZSA8LSB1bmxpc3Qoc3Ryc3BsaXQoYXZhaWxhYmxlW2ldLCBzcGxpdD0iXyIpKQpmaWxlc1tpLF0gPC0gYyhhcy52ZWN0b3IobWF0cml4KG5hbWUsIDEsMzUpKSxtYXRyaXgoU2ltX3N0YXRpc3RpY3NbWzFdXSwgMSwgMjcpKQoKfQoKCmNvbG5hbWVzKGZpbGVzKSA8LSAgYygKCglOQSwKCSJiYWNrZ3JvdW5kX3Rha2VvdmVyX3R5cGUiICwKCU5BLAoJInJlcGxpY2F0ZSIsCglOQSwKCSJNb2RlbF90eXBlIiwKCXJlcChOQSwyKSwKCSJzcGVjaWF0aW9uX29mX0Vudl9Ob25EIiwKCSJzcGVjaWF0aW9uX29mX0Vudl9EIiwKCSJzcGVjaWF0aW9uX29mX0ZvciIsCgkic3BlY2lhdGlvbl9vZl9Eb20iLAoJTkEsCgkiZXh0aW5jdGlvbl9vZl9FbnZfTm9uRCIsCgkiZXh0aW5jdGlvbl9vZl9FbnZfRCIsCgkiZXh0aW5jdGlvbl9vZl9Gb3IiLAoJImV4dGluY3Rpb25fb2ZfRG9tIiwKCU5BLAoJIlAuZGlmZnVzaW9uX1RhcmdldF9mb3JhZ2VyIiwKCSJQLmRpZmZ1c2lvbl9UYXJnZXRfZG9tZXN0aWNhdG9yIiwKCSJQLmRpZmZ1c2lvbl9Tb3VyY2VfZm9yYWdlciIsCgkiUC5kaWZmdXNpb25fU291cmNlX2RvbWVzdGljYXRvciIsCglOQSwKCSJQLnRha2VvdmVyX1RhcmdldF9mb3JhZ2VyIiwKCSJQLnRha2VvdmVyX1RhcmdldF9kb21lc3RpY2F0b3IiLAoJIlAudGFrZW92ZXJfU291cmNlX2ZvcmFnZXIiLAoJIlAudGFrZW92ZXJfU291cmNlX2RvbWVzdGljYXRvciIsCglOQSwKCSJhcmlzYWxfb2ZfRW52X05vbkQiLAoJImFyaXNhbF9vZl9FbnZfRCIsCgkiYXJpc2FsX29mX0ZvciIsCgkiYXJpc2FsX29mX0RvbSIsCgkKCU5BLCAKCSJ0aW1lc3RlcHMiLCAKCU5BLAogICAgICAgIAogICAgIm51bWJlcl9vZl9icmFuY2hlcyIsCgkiUHlsb19kaXZlcnNpdHlfaXNfc3VtX29mX0JMIiwKCSJhdmVyYWdlX3BoeWxvZ2VuZXRpY19kaXZlcnNpdHlfaXNfbWVhbl9vZl9CTCIsCgkidmFyaWFuY2VfUHlsb19kaXZlcnNpdHlfaXNfdmFyaWFuY2Vfb2ZfQkwiLAoKCSJGX3F1YWRyYXRpY19lbnRyb3B5X2lzX3N1bV9vZl9QRCIsCgkiTWVhbl9wYWlyd2lzZV9kaXN0YW5jZSIsCgkidmFyaWFuY2VfcGFpcndpc2VfZGlzdGFuY2UiLAoKCSJFdm9sdXRpb25hcnlfZGlzdGluY3RpdmVuZXNzX3N1bSIsCgkibWVhbl9QaHlsb2dlbmV0aWNfaXNvbGF0aW9uIiwKCSJ2YXJpYW5jZV9QaHlsb2dlbmV0aWNfaXNvbGF0aW9uIiwKCgkiZ2FtbWEiLAoJImdhbW1hX3BfdmFsdWUiLAoJInNwZWNpYXRpb25fcmF0ZSIsCgkiZXh0aW5jdGlvbl9yYXRlIiwKCSJleHRpbmN0aW9uX3Blcl9zcGVjaWF0aW9uIiwKCSJzcGVjaWF0aW9uX21pbnVzX2V4dGluY3Rpb24iLAoJInRyYWl0XzFfc3BlY2lhdGlvbiIsCiAgCSJ0cmFpdF8yX3NwZWNpYXRpb24iICwKICAJInRyYWl0XzFfZXh0aW5jdGlvbiIgLAogIAkidHJhaXRfMl9leHRpbmN0aW9uIiAsCiAgCSJ0cmFuc2l0aW9uX2Zyb21fdHJhaXRfMV90b18yIiAsCiAgCSJ0cmFuc2l0aW9uX2Zyb21fdHJhaXRfMl90b18xIiAsCiAgCSJ0cmFuc2l0aW9uX3JhdGVfcmF0aW9fMXRvMl9vdmVyXzJ0bzEiICwKICAJIlBoeWxvZ2VuZXRpY19zaWduYWwiLAogIAkic3BhdGlhbC50ZXN0cy5mb3JhIiwKICAJInNwYXRpYWwudGVzdHMuZG9tIiwKICAJInByZXZhbGVuY2UiCiAgCQogICAgCiAgKQoKcmVzdWx0c190YWJsZSA8LSBhcy5kYXRhLmZyYW1lKGZpbGVzKQpoZWFkKHJlc3VsdHNfdGFibGUpCmRpbShyZXN1bHRzX3RhYmxlKQpDb25jYXRlbmF0ZWRfZGF0YSA8LSByZXN1bHRzX3RhYmxlCnNhdmUoQ29uY2F0ZW5hdGVkX2RhdGEsIGZpbGU9In4vRGVza3RvcC9Gb3VyX21vZGVsX2NvbXBhcmVfcmVzdWx0cy5SZGF0YSIpCgpvbmUgPC0gc3Vic2V0KHJlc3VsdHNfdGFibGUsIE1vZGVsX3R5cGU9PSIwMSIgKQp0d28gPC0gc3Vic2V0KHJlc3VsdHNfdGFibGUsIE1vZGVsX3R5cGU9PSIwMiIgKQp0aHJlZSA8LSBzdWJzZXQocmVzdWx0c190YWJsZSwgTW9kZWxfdHlwZT09IjAzIiApCmZvdXIgPC0gc3Vic2V0KHJlc3VsdHNfdGFibGUsIE1vZGVsX3R5cGU9PSIwNCIgKQpjcm9wIDwtIG1pbihsZW5ndGgob25lWywxXSksCmxlbmd0aCh0d29bLDFdKSwKbGVuZ3RoKHRocmVlWywxXSksCmxlbmd0aChmb3VyWywxXSkpCm9uZSA8LSBvbmVbMTpjcm9wLF0KdHdvIDwtIHR3b1sxOmNyb3AsXQp0aHJlZSA8LSB0aHJlZVsxOmNyb3AsXQpmb3VyIDwtIGZvdXJbMTpjcm9wLF0KCkNvbmNhdGVuYXRlZF9kYXRhIDwtIHJiaW5kKG9uZSwgdHdvLCB0aHJlZSwgZm91cikKZGltKENvbmNhdGVuYXRlZF9kYXRhKQpzYXZlKENvbmNhdGVuYXRlZF9kYXRhLCBmaWxlPSJ+L0Rlc2t0b3AvRm91cl9tb2RlbF9jb21wYXJlX3Jlc3VsdHMuUmRhdGEiKQpjcm9wCgpgYGAKCgoKCmBgYHtyfQojIyBGaXJzdCBjb25zb2xpZGF0ZSB0aGUgYXZhaWxhYmxlIGZpbGVzIGludG8gYSBzaW5nbGUgdGFibGUKICAgIAogICAgICBwYXRoIDwtICJ+L0JveCBTeW5jL0ZvdXIgbW9kZWwgY29tcGFyZS9Nb2R1bGUgMiBleHRpbmN0IgogICAgICAgICAgIAogICAgIAogICAgICAgICAgIHNldHdkKHBhdGgpCiAgICBteWZpbGVzX2Z1bGwgPC0gbGlzdC5kaXJzKCkKICAgIGFuYWx5emVfdGhpc19tYW55IDwtIGxlbmd0aChteWZpbGVzX2Z1bGwpCiAgICAKICAgIGF2YWlsYWJsZV9maWxlcyA8LSBtYXRyaXgoTkEsIDEsIDEpCiAgICAKICAgICAgICAKICAgIGZvcihpIGluIDE6IGFuYWx5emVfdGhpc19tYW55KXsKICAgIGF2YWlsYWJsZV9maWxlcyA8LSByYmluZChhdmFpbGFibGVfZmlsZXMgLCBhcy5tYXRyaXgobGlzdC5maWxlcyhteWZpbGVzX2Z1bGxbaV0sIGZ1bGwubmFtZXMgPSBUUlVFKSkpCiAgICB9CiAgICBkaW0oYXZhaWxhYmxlX2ZpbGVzKQogICAgCiAgICBzcGxpdC5maWxlLm5hbWUgPC0gc3Ryc3BsaXQoYXZhaWxhYmxlX2ZpbGVzWzEwXSwgc3BsaXQgPSAiXyIpIAogICAgCiAgICAKICAgIAogCmF2YWlsYWJsZSA8LSBsaXN0LmZpbGVzKCkKZmlsZXMgPC0gbWF0cml4KHJlcChOQSwgNjIpLCBsZW5ndGgoYXZhaWxhYmxlKSwgNjIpCmRpbShmaWxlcykKaSA8LSAxMAoKCmZvcihpIGluIDE6bGVuZ3RoKGF2YWlsYWJsZSkpewpsb2FkKGF2YWlsYWJsZVtpXSkKbmFtZSA8LSB1bmxpc3Qoc3Ryc3BsaXQoYXZhaWxhYmxlW2ldLCBzcGxpdD0iXyIpKQpmaWxlc1tpLF0gPC0gYyhhcy52ZWN0b3IobWF0cml4KG5hbWUsIDEsMzUpKSxtYXRyaXgoU2ltX3N0YXRpc3RpY3NbWzFdXSwgMSwgMjcpKQoKfQoKCmNvbG5hbWVzKGZpbGVzKSA8LSAgYygKCglOQSwKCSJiYWNrZ3JvdW5kX3Rha2VvdmVyX3R5cGUiICwKCU5BLAoJInJlcGxpY2F0ZSIsCglOQSwKCSJNb2RlbF90eXBlIiwKCXJlcChOQSwyKSwKCSJzcGVjaWF0aW9uX29mX0Vudl9Ob25EIiwKCSJzcGVjaWF0aW9uX29mX0Vudl9EIiwKCSJzcGVjaWF0aW9uX29mX0ZvciIsCgkic3BlY2lhdGlvbl9vZl9Eb20iLAoJTkEsCgkiZXh0aW5jdGlvbl9vZl9FbnZfTm9uRCIsCgkiZXh0aW5jdGlvbl9vZl9FbnZfRCIsCgkiZXh0aW5jdGlvbl9vZl9Gb3IiLAoJImV4dGluY3Rpb25fb2ZfRG9tIiwKCU5BLAoJIlAuZGlmZnVzaW9uX1RhcmdldF9mb3JhZ2VyIiwKCSJQLmRpZmZ1c2lvbl9UYXJnZXRfZG9tZXN0aWNhdG9yIiwKCSJQLmRpZmZ1c2lvbl9Tb3VyY2VfZm9yYWdlciIsCgkiUC5kaWZmdXNpb25fU291cmNlX2RvbWVzdGljYXRvciIsCglOQSwKCSJQLnRha2VvdmVyX1RhcmdldF9mb3JhZ2VyIiwKCSJQLnRha2VvdmVyX1RhcmdldF9kb21lc3RpY2F0b3IiLAoJIlAudGFrZW92ZXJfU291cmNlX2ZvcmFnZXIiLAoJIlAudGFrZW92ZXJfU291cmNlX2RvbWVzdGljYXRvciIsCglOQSwKCSJhcmlzYWxfb2ZfRW52X05vbkQiLAoJImFyaXNhbF9vZl9FbnZfRCIsCgkiYXJpc2FsX29mX0ZvciIsCgkiYXJpc2FsX29mX0RvbSIsCgkKCU5BLCAKCSJ0aW1lc3RlcHMiLCAKCU5BLAogICAgICAgIAogICAgIm51bWJlcl9vZl9icmFuY2hlcyIsCgkiUHlsb19kaXZlcnNpdHlfaXNfc3VtX29mX0JMIiwKCSJhdmVyYWdlX3BoeWxvZ2VuZXRpY19kaXZlcnNpdHlfaXNfbWVhbl9vZl9CTCIsCgkidmFyaWFuY2VfUHlsb19kaXZlcnNpdHlfaXNfdmFyaWFuY2Vfb2ZfQkwiLAoKCSJGX3F1YWRyYXRpY19lbnRyb3B5X2lzX3N1bV9vZl9QRCIsCgkiTWVhbl9wYWlyd2lzZV9kaXN0YW5jZSIsCgkidmFyaWFuY2VfcGFpcndpc2VfZGlzdGFuY2UiLAoKCSJFdm9sdXRpb25hcnlfZGlzdGluY3RpdmVuZXNzX3N1bSIsCgkibWVhbl9QaHlsb2dlbmV0aWNfaXNvbGF0aW9uIiwKCSJ2YXJpYW5jZV9QaHlsb2dlbmV0aWNfaXNvbGF0aW9uIiwKCgkiZ2FtbWEiLAoJImdhbW1hX3BfdmFsdWUiLAoJInNwZWNpYXRpb25fcmF0ZSIsCgkiZXh0aW5jdGlvbl9yYXRlIiwKCSJleHRpbmN0aW9uX3Blcl9zcGVjaWF0aW9uIiwKCSJzcGVjaWF0aW9uX21pbnVzX2V4dGluY3Rpb24iLAoJInRyYWl0XzFfc3BlY2lhdGlvbiIsCiAgCSJ0cmFpdF8yX3NwZWNpYXRpb24iICwKICAJInRyYWl0XzFfZXh0aW5jdGlvbiIgLAogIAkidHJhaXRfMl9leHRpbmN0aW9uIiAsCiAgCSJ0cmFuc2l0aW9uX2Zyb21fdHJhaXRfMV90b18yIiAsCiAgCSJ0cmFuc2l0aW9uX2Zyb21fdHJhaXRfMl90b18xIiAsCiAgCSJ0cmFuc2l0aW9uX3JhdGVfcmF0aW9fMXRvMl9vdmVyXzJ0bzEiICwKICAJIlBoeWxvZ2VuZXRpY19zaWduYWwiLAogIAkic3BhdGlhbC50ZXN0cy5mb3JhIiwKICAJInNwYXRpYWwudGVzdHMuZG9tIiwKICAJInByZXZhbGVuY2UiCiAgCQogICAgCiAgKQoKQ29uY2F0ZW5hdGVkX2RhdGEgPC0gYXMuZGF0YS5mcmFtZShmaWxlcykKaGVhZChDb25jYXRlbmF0ZWRfZGF0YSkKZGltKENvbmNhdGVuYXRlZF9kYXRhKQoKc2F2ZShDb25jYXRlbmF0ZWRfZGF0YSwgZmlsZT0ifi9EZXNrdG9wL0ZvdXJfbW9kZWxfY29tcGFyZV9yZXN1bHRzX2V4dGluY3QuUmRhdGEiKQoKCmBgYAoKCmBgYHtyfQpsb2FkKCd+L0JveCBTeW5jL2NvbGxpZGluZyByYW5nZXMvU2ltdWxhdGlvbnNfaHVtYW5zL1Jlc3VsdHMvRm91cl9tb2RlbF9jb21wYXJlX3Jlc3VsdHNfZXh0aW5jdC5SZGF0YScpCmV4dGluY3QgPC0gQ29uY2F0ZW5hdGVkX2RhdGEKbG9hZCgnfi9Cb3ggU3luYy9jb2xsaWRpbmcgcmFuZ2VzL1NpbXVsYXRpb25zX2h1bWFucy9SZXN1bHRzL0ZvdXJfbW9kZWxfY29tcGFyZV9yZXN1bHRzLlJkYXRhJykKZXh0YW50IDwtIENvbmNhdGVuYXRlZF9kYXRhCm5hbWVzKGV4dGluY3QpCm5hbWVzKGV4dGFudCkKYGBgCgoKCmBgYHtyfQoKZm9yKGkgaW4gYyg5LDEwLDExLDEyLDE0LDE1LDE2LDE3LDE5LDIwLDIxLDIyLDI0LDI1LDI2LDI3LDI5LDMwLDMxLDMyKSl7CglleHRpbmN0W3doaWNoKGlzLm5hbihhcy5udW1lcmljKGFzLmNoYXJhY3RlcihleHRpbmN0WywgaV0pKSkgPT0gVFJVRSksIGldIDwtIE5BCn0KCmZvcihpIGluIGMoOSwxMCwxMSwxMiwxNCwxNSwxNiwxNywxOSwyMCwyMSwyMiwyNCwyNSwyNiwyNywyOSwzMCwzMSwzMikpewoJZXh0YW50W3doaWNoKGlzLm5hbihhcy5udW1lcmljKGFzLmNoYXJhY3RlcihleHRhbnRbLCBpXSkpKSA9PSBUUlVFKSwgaV0gPC0gTkEKfQoKaSA8LSAxOQpmb3IoaSBpbiBjKDIwLDIxLDI0LDI1LDI2LDI3KSl7CglleHRpbmN0W3doaWNoKGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGluY3RbLCBpXSkpID09IDApLCBpXSA8LSBOQQp9Cgpmb3IoaSBpbiBjKDIwLDIxLDI0LDI1LDI2LDI3KSl7CglleHRhbnRbd2hpY2goYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZXh0YW50WywgaV0pKSA9PSAwKSwgaV0gPC0gTkEKfQoKCnhsaW1pdCA8LSBjKDAsMSkKeWxpbWl0IDwtIGMoMCw2MDApCm1haW5jZXggPC0gMC45CgpwbmcoZmlsZT0iR2xvYmFsX3N1Y2Nlc3NfcmF0ZV9wZXJfcGFyYW1ldGVyLnBuZyIsIHdpZHRoPTguNSwgaGVpZ2h0PTExLCB1bml0cz0iaW4iLCByZXM9MzAwKQoKcGFyKG1mcm93PWMoNSw0KSwgbWFyPWMoMywzLDMsMCkpCgoKaGlzdChhcy5udW1lcmljKGFzLmNoYXJhY3RlcihleHRpbmN0Wyw5XSkpLCBtYWluPSJzcGVjaWF0aW9uIG9mIEYgaW4gRiBlbnYiLCBjb2w9YWRqdXN0Y29sb3IoImZpcmVicmljayIsIGFscGhhPTAuNyksIGJyZWFrcz0xMDAsIGJvcmRlcj1OQSwgeGxpbT0geGxpbWl0LCB5bGltPSB5bGltaXQsIGNleC5tYWluPSBtYWluY2V4KQpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGFudFssOV0pKSwgbWFpbj0ic3BlY2lhdGlvbiBvZiBGIGluIEYgZW52IiwgY29sPWFkanVzdGNvbG9yKCJjb3JuZmxvd2VyYmx1ZSIsIGFscGhhPTAuNyksIGJyZWFrcz0xMDAsIGJvcmRlcj1OQSwgeGxpbT0geGxpbWl0LCB5bGltPSB5bGltaXQsIGNleC5tYWluPSBtYWluY2V4LCBhZGQ9VFJVRSkKCgpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGluY3RbLDEwXSkpLCBtYWluPSJzcGVjaWF0aW9uIG9mIEQgaW4gRiBlbnYiLCBjb2w9YWRqdXN0Y29sb3IoImZpcmVicmljayIsIGFscGhhPSAwLjcpLCBicmVha3M9MTAwLCBib3JkZXI9TkEsIHhsaW09IHhsaW1pdCwgeWxpbT0geWxpbWl0LCBjZXgubWFpbj0gbWFpbmNleCkKaGlzdChhcy5udW1lcmljKGFzLmNoYXJhY3RlcihleHRhbnRbLDEwXSkpLCBtYWluPSJzcGVjaWF0aW9uIG9mIEQgaW4gRiBlbnYiLCBjb2w9YWRqdXN0Y29sb3IoImNvcm5mbG93ZXJibHVlIiwgYWxwaGE9IDAuNyksIGJyZWFrcz0xMDAsIGJvcmRlcj1OQSwgeGxpbT0geGxpbWl0LCB5bGltPSB5bGltaXQsIGNleC5tYWluPSBtYWluY2V4LCBhZGQ9VFJVRSkKCgpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGluY3RbLDExXSkpLCBtYWluPSJzcGVjaWF0aW9uIG9mIEYgaW4gRCBlbnYiLCBjb2w9YWRqdXN0Y29sb3IoImZpcmVicmljayIsIGFscGhhPSAwLjcpLCBicmVha3M9MTAwLCBib3JkZXI9TkEsIHhsaW09IHhsaW1pdCwgeWxpbT0geWxpbWl0LCBjZXgubWFpbj0gbWFpbmNleCkKaGlzdChhcy5udW1lcmljKGFzLmNoYXJhY3RlcihleHRhbnRbLDExXSkpLCBtYWluPSJzcGVjaWF0aW9uIG9mIEYgaW4gRCBlbnYiLCBjb2w9YWRqdXN0Y29sb3IoImNvcm5mbG93ZXJibHVlIiwgYWxwaGE9IDAuNyksIGJyZWFrcz0xMDAsIGJvcmRlcj1OQSwgeGxpbT0geGxpbWl0LCB5bGltPSB5bGltaXQsIGNleC5tYWluPSBtYWluY2V4LCBhZGQ9VFJVRSkKCmhpc3QoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZXh0aW5jdFssMTJdKSksIG1haW49InNwZWNpYXRpb24gb2YgRCBpbiBEIGVudiIsIGNvbD1hZGp1c3Rjb2xvcigiZmlyZWJyaWNrIiwgYWxwaGE9IDAuNyksIGJyZWFrcz0xMDAsIGJvcmRlcj1OQSwgeGxpbT0geGxpbWl0LCB5bGltPSB5bGltaXQsIGNleC5tYWluPSBtYWluY2V4KQpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGFudFssMTJdKSksIG1haW49InNwZWNpYXRpb24gb2YgRCBpbiBEIGVudiIsIGNvbD1hZGp1c3Rjb2xvcigiY29ybmZsb3dlcmJsdWUiLCBhbHBoYT0gMC43KSwgYnJlYWtzPTEwMCwgYm9yZGVyPU5BLCB4bGltPSB4bGltaXQsIHlsaW09IHlsaW1pdCwgY2V4Lm1haW49IG1haW5jZXgsIGFkZD1UUlVFKQoKIyMjIyMjIwoKaGlzdChhcy5udW1lcmljKGFzLmNoYXJhY3RlcihleHRpbmN0WywgMTRdKSksIG1haW49ImV4dGluY3Rpb24gb2YgRiBpbiBGIGVudiIsIGNvbD1hZGp1c3Rjb2xvcigiZmlyZWJyaWNrIiwgYWxwaGE9IDAuNyksIGJyZWFrcz0xMDAsIGJvcmRlcj1OQSwgeGxpbT0geGxpbWl0LCB5bGltPSB5bGltaXQsIGNleC5tYWluPSBtYWluY2V4KQpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGFudFssIDE0XSkpLCBtYWluPSJleHRpbmN0aW9uIG9mIEYgaW4gRiBlbnYiLCBjb2w9YWRqdXN0Y29sb3IoImNvcm5mbG93ZXJibHVlIiwgYWxwaGE9IDAuNyksIGJyZWFrcz0xMDAsIGJvcmRlcj1OQSwgeGxpbT0geGxpbWl0LCB5bGltPSB5bGltaXQsIGNleC5tYWluPSBtYWluY2V4LCBhZGQ9VFJVRSkKCgoKaGlzdChhcy5udW1lcmljKGFzLmNoYXJhY3RlcihleHRpbmN0WywgMTVdKSksIG1haW49ImV4dGluY3Rpb24gb2YgRCBpbiBGIGVudiIsIGNvbD1hZGp1c3Rjb2xvcigiZmlyZWJyaWNrIiwgYWxwaGE9IDAuNyksIGJyZWFrcz0xMDAsIGJvcmRlcj1OQSwgeGxpbT0geGxpbWl0LCB5bGltPSB5bGltaXQsIGNleC5tYWluPSBtYWluY2V4KQpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGFudFssIDE1XSkpLCBtYWluPSJleHRpbmN0aW9uIG9mIEQgaW4gRiBlbnYiLCBjb2w9YWRqdXN0Y29sb3IoImNvcm5mbG93ZXJibHVlIiwgYWxwaGE9IDAuNyksIGJyZWFrcz0xMDAsIGJvcmRlcj1OQSwgeGxpbT0geGxpbWl0LCB5bGltPSB5bGltaXQsIGNleC5tYWluPSBtYWluY2V4LCBhZGQ9VFJVRSkKCmhpc3QoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZXh0aW5jdFssIDE2XSkpLCBtYWluPSJleHRpbmN0aW9uIG9mIEYgaW4gRCBlbnYiLCBjb2w9YWRqdXN0Y29sb3IoImZpcmVicmljayIsIGFscGhhPSAwLjcpLCBicmVha3M9MTAwLCBib3JkZXI9TkEsIHhsaW09IHhsaW1pdCwgeWxpbT0geWxpbWl0LCBjZXgubWFpbj0gbWFpbmNleCkKaGlzdChhcy5udW1lcmljKGFzLmNoYXJhY3RlcihleHRhbnRbLCAxNl0pKSwgbWFpbj0iZXh0aW5jdGlvbiBvZiBGIGluIEQgZW52IiwgY29sPWFkanVzdGNvbG9yKCJjb3JuZmxvd2VyYmx1ZSIsIGFscGhhPSAwLjcpLCBicmVha3M9MTAwLCBib3JkZXI9TkEsIHhsaW09IHhsaW1pdCwgeWxpbT0geWxpbWl0LCBjZXgubWFpbj0gbWFpbmNleCwgYWRkPVRSVUUpCgpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGluY3RbLCAxN10pKSwgbWFpbj0iZXh0aW5jdGlvbiBvZiBEIGluIEQgZW52IiwgY29sPWFkanVzdGNvbG9yKCJmaXJlYnJpY2siLCBhbHBoYT0gMC43KSwgYnJlYWtzPTEwMCwgYm9yZGVyPU5BLCB4bGltPSB4bGltaXQsIHlsaW09IHlsaW1pdCwgY2V4Lm1haW49IG1haW5jZXgpCmhpc3QoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZXh0YW50WywgMTddKSksIG1haW49ImV4dGluY3Rpb24gb2YgRCBpbiBEIGVudiIsIGNvbD1hZGp1c3Rjb2xvcigiY29ybmZsb3dlcmJsdWUiLCBhbHBoYT0gMC43KSwgYnJlYWtzPTEwMCwgYm9yZGVyPU5BLCB4bGltPSB4bGltaXQsIHlsaW09IHlsaW1pdCwgY2V4Lm1haW49IG1haW5jZXgsIGFkZD1UUlVFKQoKIyMjIyMjCgpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGluY3RbLCAyOV0pKSwgbWFpbj0iYXJpc2FsIG9mIEYgaW4gRiBlbnYiLCBjb2w9YWRqdXN0Y29sb3IoImZpcmVicmljayIsIGFscGhhPSAwLjcpLCBicmVha3M9MTAwLCBib3JkZXI9TkEsIHhsaW09IHhsaW1pdCwgeWxpbT0geWxpbWl0LCBjZXgubWFpbj0gbWFpbmNleCkKaGlzdChhcy5udW1lcmljKGFzLmNoYXJhY3RlcihleHRhbnRbLCAyOV0pKSwgbWFpbj0iYXJpc2FsIG9mIEYgaW4gRiBlbnYiLCBjb2w9YWRqdXN0Y29sb3IoImNvcm5mbG93ZXJibHVlIiwgYWxwaGE9IDAuNyksIGJyZWFrcz0xMDAsIGJvcmRlcj1OQSwgeGxpbT0geGxpbWl0LCB5bGltPSB5bGltaXQsIGNleC5tYWluPSBtYWluY2V4LCBhZGQ9VFJVRSkKCgoKaGlzdChhcy5udW1lcmljKGFzLmNoYXJhY3RlcihleHRpbmN0WywgMzBdKSksIG1haW49ImFyaXNhbCBvZiBEIGluIEYgZW52IiwgY29sPWFkanVzdGNvbG9yKCJmaXJlYnJpY2siLCBhbHBoYT0gMC43KSwgYnJlYWtzPTEwMCwgYm9yZGVyPU5BLCB4bGltPSB4bGltaXQsIHlsaW09IHlsaW1pdCwgY2V4Lm1haW49IG1haW5jZXgpCmhpc3QoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZXh0YW50WywgMzBdKSksIG1haW49ImFyaXNhbCBvZiBEIGluIEYgZW52IiwgY29sPWFkanVzdGNvbG9yKCJjb3JuZmxvd2VyYmx1ZSIsIGFscGhhPSAwLjcpLCBicmVha3M9MTAwLCBib3JkZXI9TkEsIHhsaW09IHhsaW1pdCwgeWxpbT0geWxpbWl0LCBjZXgubWFpbj0gbWFpbmNleCwgYWRkPVRSVUUpCgpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGluY3RbLCAzMV0pKSwgbWFpbj0iYXJpc2FsIG9mIEYgaW4gRCBlbnYiLCBjb2w9YWRqdXN0Y29sb3IoImZpcmVicmljayIsIGFscGhhPSAwLjcpLCBicmVha3M9MTAwLCBib3JkZXI9TkEsIHhsaW09IHhsaW1pdCwgeWxpbT0geWxpbWl0LCBjZXgubWFpbj0gbWFpbmNleCkKaGlzdChhcy5udW1lcmljKGFzLmNoYXJhY3RlcihleHRhbnRbLCAzMV0pKSwgbWFpbj0iYXJpc2FsIG9mIEYgaW4gRCBlbnYiLCBjb2w9YWRqdXN0Y29sb3IoImNvcm5mbG93ZXJibHVlIiwgYWxwaGE9IDAuNyksIGJyZWFrcz0xMDAsIGJvcmRlcj1OQSwgeGxpbT0geGxpbWl0LCB5bGltPSB5bGltaXQsIGNleC5tYWluPSBtYWluY2V4LCBhZGQ9VFJVRSkKCmhpc3QoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZXh0aW5jdFssIDMyXSkpLCBtYWluPSJhcmlzYWwgb2YgRCBpbiBEIGVudiIsIGNvbD1hZGp1c3Rjb2xvcigiZmlyZWJyaWNrIiwgYWxwaGE9IDAuNyksIGJyZWFrcz0xMDAsIGJvcmRlcj1OQSwgeGxpbT0geGxpbWl0LCB5bGltPSB5bGltaXQsIGNleC5tYWluPSBtYWluY2V4KQpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGFudFssIDMyXSkpLCBtYWluPSJhcmlzYWwgb2YgRCBpbiBEIGVudiIsIGNvbD1hZGp1c3Rjb2xvcigiY29ybmZsb3dlcmJsdWUiLCBhbHBoYT0gMC43KSwgYnJlYWtzPTEwMCwgYm9yZGVyPU5BLCB4bGltPSB4bGltaXQsIHlsaW09IHlsaW1pdCwgY2V4Lm1haW49IG1haW5jZXgsIGFkZD1UUlVFKQoKIyMjIyMjCgpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGluY3RbLCAxOV0pKSwgbWFpbj0iTk9QRSAtLSBEaWZmdXNpb246IHNvdXJjZSBGLCB0YXJnZXQgRiIsIGNvbD1hZGp1c3Rjb2xvcigiZmlyZWJyaWNrIiwgYWxwaGE9IDAuNyksIGJyZWFrcz0xMDAsIGJvcmRlcj1OQSwgeGxpbT0geGxpbWl0LCB5bGltPSBjKDAsMTgwMDApLCBjZXgubWFpbj0gbWFpbmNleCkKaGlzdChhcy5udW1lcmljKGFzLmNoYXJhY3RlcihleHRhbnRbLCAxOV0pKSwgbWFpbj0iTk9QRSAtLSBEaWZmdXNpb246IHNvdXJjZSBGLCB0YXJnZXQgRiIsIGNvbD1hZGp1c3Rjb2xvcigiY29ybmZsb3dlcmJsdWUiLCBhbHBoYT0gMC43KSwgYnJlYWtzPTEwMCwgYm9yZGVyPU5BLCB4bGltPSB4bGltaXQsIHlsaW09IGMoMCwxODAwMCksIGNleC5tYWluPSBtYWluY2V4LCBhZGQ9VFJVRSkKCgoKaGlzdChhcy5udW1lcmljKGFzLmNoYXJhY3RlcihleHRpbmN0WywgMjBdKSksIG1haW49IkRpZmZ1c2lvbjogc291cmNlIEQsIHRhcmdldCBGIiwgY29sPWFkanVzdGNvbG9yKCJmaXJlYnJpY2siLCBhbHBoYT0gMC43KSwgYnJlYWtzPTEwMCwgYm9yZGVyPU5BLCB4bGltPSB4bGltaXQsIHlsaW09IHlsaW1pdCwgY2V4Lm1haW49IG1haW5jZXgpCmhpc3QoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZXh0YW50WywgMjBdKSksIG1haW49IkRpZmZ1c2lvbjogc291cmNlIEQsIHRhcmdldCBGIiwgY29sPWFkanVzdGNvbG9yKCJjb3JuZmxvd2VyYmx1ZSIsIGFscGhhPSAwLjcpLCBicmVha3M9MTAwLCBib3JkZXI9TkEsIHhsaW09IHhsaW1pdCwgeWxpbT0geWxpbWl0LCBjZXgubWFpbj0gbWFpbmNleCwgYWRkPVRSVUUpCgpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGluY3RbLCAyMV0pKSwgbWFpbj0iRGlmZnVzaW9uOiBzb3VyY2UgRiwgdGFyZ2V0IEQiLCBjb2w9YWRqdXN0Y29sb3IoImZpcmVicmljayIsIGFscGhhPSAwLjcpLCBicmVha3M9MTAwLCBib3JkZXI9TkEsIHhsaW09IHhsaW1pdCwgeWxpbT0geWxpbWl0LCBjZXgubWFpbj0gbWFpbmNleCkKaGlzdChhcy5udW1lcmljKGFzLmNoYXJhY3RlcihleHRhbnRbLCAyMV0pKSwgbWFpbj0iRGlmZnVzaW9uOiBzb3VyY2UgRiwgdGFyZ2V0IEQiLCBjb2w9YWRqdXN0Y29sb3IoImNvcm5mbG93ZXJibHVlIiwgYWxwaGE9IDAuNyksIGJyZWFrcz0xMDAsIGJvcmRlcj1OQSwgeGxpbT0geGxpbWl0LCB5bGltPSB5bGltaXQsIGNleC5tYWluPSBtYWluY2V4LCBhZGQ9VFJVRSkKCmhpc3QoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZXh0aW5jdFssIDIyXSkpLCBtYWluPSJOT1BFIC0tIERpZmZ1c2lvbjogc291cmNlIEQsIHRhcmdldCBEIiwgY29sPWFkanVzdGNvbG9yKCJmaXJlYnJpY2siLCBhbHBoYT0gMC43KSwgYnJlYWtzPTEwMCwgYm9yZGVyPU5BLCB4bGltPSB4bGltaXQsIHlsaW09IGMoMCwxODAwMCksIGNleC5tYWluPSBtYWluY2V4KQpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGFudFssIDIyXSkpLCBtYWluPSJOT1BFIC0tIERpZmZ1c2lvbjogc291cmNlIEQsIHRhcmdldCBEIiwgY29sPWFkanVzdGNvbG9yKCJjb3JuZmxvd2VyYmx1ZSIsIGFscGhhPSAwLjcpLCBicmVha3M9MTAwLCBib3JkZXI9TkEsIHhsaW09IHhsaW1pdCwgeWxpbT0gYygwLDE4MDAwKSwgY2V4Lm1haW49IG1haW5jZXgsIGFkZD1UUlVFKQoKIyMjIwoKaGlzdChhcy5udW1lcmljKGFzLmNoYXJhY3RlcihleHRpbmN0WywgMjRdKSksIG1haW49IlRha2VvdmVyOiBzb3VyY2UgRiwgdGFyZ2V0IEYiLCBjb2w9YWRqdXN0Y29sb3IoImZpcmVicmljayIsIGFscGhhPSAwLjcpLCBicmVha3M9MTAwLCBib3JkZXI9TkEsIHhsaW09IHhsaW1pdCwgeWxpbT0geWxpbWl0LCBjZXgubWFpbj0gbWFpbmNleCkKaGlzdChhcy5udW1lcmljKGFzLmNoYXJhY3RlcihleHRhbnRbLCAyNF0pKSwgbWFpbj0iVGFrZW92ZXI6IHNvdXJjZSBGLCB0YXJnZXQgRiIsIGNvbD1hZGp1c3Rjb2xvcigiY29ybmZsb3dlcmJsdWUiLCBhbHBoYT0gMC43KSwgYnJlYWtzPTEwMCwgYm9yZGVyPU5BLCB4bGltPSB4bGltaXQsIHlsaW09IHlsaW1pdCwgY2V4Lm1haW49IG1haW5jZXgsIGFkZD1UUlVFKQoKCgpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGluY3RbLCAyNV0pKSwgbWFpbj0iVGFrZW92ZXI6IHNvdXJjZSBELCB0YXJnZXQgRiIsIGNvbD1hZGp1c3Rjb2xvcigiZmlyZWJyaWNrIiwgYWxwaGE9IDAuNyksIGJyZWFrcz0xMDAsIGJvcmRlcj1OQSwgeGxpbT0geGxpbWl0LCB5bGltPSB5bGltaXQsIGNleC5tYWluPSBtYWluY2V4KQpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGFudFssIDI1XSkpLCBtYWluPSJUYWtlb3Zlcjogc291cmNlIEQsIHRhcmdldCBGIiwgY29sPWFkanVzdGNvbG9yKCJjb3JuZmxvd2VyYmx1ZSIsIGFscGhhPSAwLjcpLCBicmVha3M9MTAwLCBib3JkZXI9TkEsIHhsaW09IHhsaW1pdCwgeWxpbT0geWxpbWl0LCBjZXgubWFpbj0gbWFpbmNleCwgYWRkPVRSVUUpCgpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGluY3RbLCAyNl0pKSwgbWFpbj0iVGFrZW92ZXI6IHNvdXJjZSBGLCB0YXJnZXQgRCIsIGNvbD1hZGp1c3Rjb2xvcigiZmlyZWJyaWNrIiwgYWxwaGE9IDAuNyksIGJyZWFrcz0xMDAsIGJvcmRlcj1OQSwgeGxpbT0geGxpbWl0LCB5bGltPSB5bGltaXQsIGNleC5tYWluPSBtYWluY2V4KQpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGFudFssIDI2XSkpLCBtYWluPSJUYWtlb3Zlcjogc291cmNlIEYsIHRhcmdldCBEIiwgY29sPWFkanVzdGNvbG9yKCJjb3JuZmxvd2VyYmx1ZSIsIGFscGhhPSAwLjcpLCBicmVha3M9MTAwLCBib3JkZXI9TkEsIHhsaW09IHhsaW1pdCwgeWxpbT0geWxpbWl0LCBjZXgubWFpbj0gbWFpbmNleCwgYWRkPVRSVUUpCgpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGluY3RbLCAyN10pKSwgbWFpbj0iVGFrZW92ZXI6IHNvdXJjZSBELCB0YXJnZXQgRCIsIGNvbD1hZGp1c3Rjb2xvcigiZmlyZWJyaWNrIiwgYWxwaGE9IDAuNyksIGJyZWFrcz0xMDAsIGJvcmRlcj1OQSwgeGxpbT0geGxpbWl0LCB5bGltPSB5bGltaXQsIGNleC5tYWluPSBtYWluY2V4KQpoaXN0KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGFudFssIDI3XSkpLCBtYWluPSJUYWtlb3Zlcjogc291cmNlIEQsIHRhcmdldCBEIiwgY29sPWFkanVzdGNvbG9yKCJjb3JuZmxvd2VyYmx1ZSIsIGFscGhhPSAwLjcpLCBicmVha3M9MTAwLCBib3JkZXI9TkEsIHhsaW09IHhsaW1pdCwgeWxpbT0geWxpbWl0LCBjZXgubWFpbj0gbWFpbmNleCwgYWRkPVRSVUUpCgoKZGV2Lm9mZigpCgoKCgoKCmBgYAoKCiFbXShHbG9iYWxfc3VjY2Vzc19yYXRlX3Blcl9wYXJhbWV0ZXIucG5nKQoKCmBgYHtyfQoKCgpwbmcoZmlsZT0iZXh0aWN0aW9uIG1pbnVzIGV4dGFudCBwZXIgb3V0Y29tZS5wbmciLCB3aWR0aD04LjUsIGhlaWdodD0xMSwgdW5pdHM9ImluIiwgcmVzPTMwMCkKcGFyKG1mcm93PWMoMywxKSkKCnBsb3QoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZXh0aW5jdFssOV0pKSwgYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZXh0aW5jdFssMTRdKSksIHhsYWI9InNwZWNpYXRpb24iLCB5bGFiPSJleHRpbmN0aW9uIiwgY29sPSBhZGp1c3Rjb2xvcigiZmlyZWJyaWNrIiwgYWxwaGE9MC4yKSwgcGNoPTE5LCBjZXg9MC42LCB5bGltPWMoMCwxKSkKcGxvdChhcy5udW1lcmljKGFzLmNoYXJhY3RlcihleHRhbnRbLDldKSksIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGV4dGFudFssMTRdKSksIHhsYWI9InNwZWNpYXRpb24iLCB5bGFiPSJleHRpbmN0aW9uIiwgY29sPSBhZGp1c3Rjb2xvcigiY29ybmZsb3dlcmJsdWUiLCBhbHBoYT0wLjIpLCBwY2g9MTksIGNleD0wLjYsIHlsaW09YygwLDEpKQoKcGxvdChhcy5udW1lcmljKGFzLmNoYXJhY3RlcihleHRpbmN0Wyw5XSkpLCBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihleHRpbmN0WywxNF0pKSwgeGxhYj0ic3BlY2lhdGlvbiIsIHlsYWI9ImV4dGluY3Rpb24iLCBjb2w9IGFkanVzdGNvbG9yKCJmaXJlYnJpY2siLCBhbHBoYT0wLjIpLCBwY2g9MTksIGNleD0wLjYsIHlsaW09YygwLDEpKQpwb2ludHMoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZXh0YW50Wyw5XSkpLCBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihleHRhbnRbLDE0XSkpLCB4bGFiPSJzcGVjaWF0aW9uIiwgeWxhYj0iZXh0aW5jdGlvbiIsIGNvbD0gYWRqdXN0Y29sb3IoImNvcm5mbG93ZXJibHVlIiwgYWxwaGE9MC4yKSwgcGNoPTE5LCBjZXg9MC42KQoKCmRldi5vZmYoKQoKCmBgYAoKIVtdKGV4dGljdGlvbiBtaW51cyBleHRhbnQgcGVyIG91dGNvbWUucG5nKQoKCgpgYGB7cn0KCgpsb2FkKCd+L0JveCBTeW5jL2NvbGxpZGluZyByYW5nZXMvU2ltdWxhdGlvbnNfaHVtYW5zL0F2YWlsYWJsZSB0cmVlcy9yZWFsLmFuYWx5c2lzLlJEYXRhJykKCgoKI0NvbmNhdGVuYXRlZF9kYXRhIDwtIENvbmNhdGVuYXRlZF9kYXRhW0NvbmNhdGVuYXRlZF9kYXRhWywgMl0gPT0gInN0YXRzLm5vLmJUTyIsIF0KI0NvbmNhdGVuYXRlZF9kYXRhIDwtIENvbmNhdGVuYXRlZF9kYXRhW0NvbmNhdGVuYXRlZF9kYXRhWywgNl0gIT0gIjA1IiwgXQojIENvbmNhdGVuYXRlZF9kYXRhWywgNl0gPC0gYXMubnVtZXJpYyhDb25jYXRlbmF0ZWRfZGF0YVssIDZdKQojICMgQ29uY2F0ZW5hdGVkX2RhdGFbb3JpZ2luYWxbLCAyXSA9PSAiYmFja2dyb3VuZF90YWtlb3ZlciIsIDZdIDwtICBDb25jYXRlbmF0ZWRfZGF0YVtvcmlnaW5hbFssIDJdID09ICJiYWNrZ3JvdW5kX3Rha2VvdmVyIiwgNl0gKyA0CkNvbmNhdGVuYXRlZF9kYXRhWywgNl0gPC0gZmFjdG9yKENvbmNhdGVuYXRlZF9kYXRhWywgNl0pCiNoZWFkKENvbmNhdGVuYXRlZF9kYXRhKQojbmFtZXMoQ29uY2F0ZW5hdGVkX2RhdGEpCgpQQ0FkYXRhIDwtIENvbmNhdGVuYXRlZF9kYXRhWywgLSgxOjM1KV0KUENBZGF0YSA8LSBQQ0FkYXRhWywgLTEyXQpQQ0FkYXRhIDwtIGFwcGx5KFBDQWRhdGEsIDIsIGFzLm51bWVyaWMpCnJlbW92ZSA8LSBhcHBseShpcy5uYShQQ0FkYXRhKSwgMSwgYW55KQpQQ0FkYXRhIDwtIFBDQWRhdGFbIXJlbW92ZSwgXQoKIyBQcmVkaWN0aW9ucwpsaWJyYXJ5KHJhbmRvbUZvcmVzdCkKCmRhdGEuYW5hbHlzaXMuY29tcDIgPC0gZGF0YS5mcmFtZSgiTW9kZWwiID0gYXMuZmFjdG9yKENvbmNhdGVuYXRlZF9kYXRhWyFyZW1vdmUsIDZdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDQWRhdGEpCmRhdGEuYW5hbHlzaXMuY29tcDIkc3ByYXRlIDwtIGRhdGEuYW5hbHlzaXMuY29tcDIkdHJhaXRfMV9zcGVjaWF0aW9uL2RhdGEuYW5hbHlzaXMuY29tcDIkdHJhaXRfMl9zcGVjaWF0aW9uCmRhdGEuYW5hbHlzaXMuY29tcDIkZXh0cmF0ZSA8LSBkYXRhLmFuYWx5c2lzLmNvbXAyJHRyYWl0XzFfZXh0aW5jdGlvbi9kYXRhLmFuYWx5c2lzLmNvbXAyJHRyYWl0XzJfZXh0aW5jdGlvbgoKCiNsb2FkKCJSZWFsX3BoeS9yZWFsLmFuYWx5c2lzLlJEYXRhIikKYSA8LSBhcy5kYXRhLmZyYW1lKHJlYWwuYW5hbHlzaXMkcmVzdWx0c19zdW1tYXJ5X29mX3NpbmdsZV92YWx1ZV9vdXRwdXRzKQphJHNwcmF0ZSA8LSBhJHRyYWl0XzFfc3BlY2lhdGlvbiAvIGEkdHJhaXRfMl9zcGVjaWF0aW9uCmEkZXh0cmF0ZSA8LSBhJHRyYWl0XzFfZXh0aW5jdGlvbiAvIGEkdHJhaXRfMl9leHRpbmN0aW9uCgpkYXRhLmFuYWx5c2lzLmNvbXAzIDwtIGRhdGEuYW5hbHlzaXMuY29tcDJbLCAtYygyLCAxMzoxNCwgMTY6MjApXQojZGF0YS5hbmFseXNpcy5jb21wMyA8LSBkYXRhLmFuYWx5c2lzLmNvbXAzW2RhdGEuYW5hbHlzaXMuY29tcDMkTW9kZWwgJWluJSAxOjQsIF0KI2RhdGEuYW5hbHlzaXMuY29tcDMkTW9kZWwgPC0gZmFjdG9yKGRhdGEuYW5hbHlzaXMuY29tcDMkTW9kZWwpCiNzdWIgPC0gdW5saXN0KGxhcHBseShhcy5saXN0KGMoMTo0KSksIGZ1bmN0aW9uKHgsIHkpIHsKIyAgc2FtcGxlKHdoaWNoKHkkTW9kZWwgPT0geCksIG1pbih0YWJsZShkYXRhLmFuYWx5c2lzLmNvbXAzJE1vZGVsKSkpfSwKIyAgeSA9IGRhdGEuYW5hbHlzaXMuY29tcDMpKQojIGRhdGEuYW5hbHlzaXMuY29tcDMgPC0gZGF0YS5hbmFseXNpcy5jb21wM1tzdWIsIF0KZnVuIDwtIGZ1bmN0aW9uKHgsIHksIHBlciA9IC4zMykge3NhbXBsZSh3aGljaCh5JE1vZGVsID09IHgpLCByb3VuZCh0YWJsZSh5JE1vZGVsKVsxXSpwZXIpKX0KCnN1Yi50ZXN0IDwtIHVubGlzdChsYXBwbHkoYXMubGlzdChwYXN0ZTAoMCwgYygxOjQpKSksIGZ1biwKICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gZGF0YS5hbmFseXNpcy5jb21wMykpCnRlc3QyIDwtIGRhdGEuYW5hbHlzaXMuY29tcDNbc3ViLnRlc3QsIDI6bmNvbChkYXRhLmFuYWx5c2lzLmNvbXAzKV0KdGVzdDEgPC0gZGF0YS5hbmFseXNpcy5jb21wM1tzdWIudGVzdCwgMV0KdHJhaW4gPC0gZGF0YS5hbmFseXNpcy5jb21wM1stc3ViLnRlc3QsIF0KKGZpdCA8LSByYW5kb21Gb3Jlc3QoTW9kZWwgfiAuLCBkYXRhPXRyYWluLCB4dGVzdCA9IHRlc3QyLCB5dGVzdCA9IHRlc3QxLCAKICAgICAgICAgICAgICAgICAgICBpbXBvcnRhbmNlPVRSVUUsIG50cmVlPTI0MDAsIGtlZXAuZm9yZXN0ID0gVFJVRSkpCgpwcmVkaWN0aW9ucyA8LSBwcmVkaWN0KGZpdCwgCiAgICAgICAgICAgICAgICAgICAgICAgYSwKICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJwcm9iIikKCgpgYGAKCgoKCgpgYGB7cn0KCnBsb3QoZml0LCB5bGltPWMoMCwxKSkKCmBgYAoKCgoKYGBge3J9CmxhYnMgPC0gYygiQmFzaWMiLCAiK0RpZmZ1c2lvbiIsICIrVGFrZW92ZXIiLCAiK0RpZmZ1c2lvbiArVGFrZW92ZXIiKQoKYGBgCgoKYGBge3J9CiMgYmFyIHBsb3QKcG5nKCJQcm9iX2F1cy5wbmciLCB3aWR0aCA9IDI1LCBoZWlnaHQgPSAyNSwgcmVzID0gMzAwLCB1bml0cyA9ICJpbiIpCnBhcihtYXIgPSBjKDgsIDgsIDEsIDEpKQpwcmVkIDwtIHNldE5hbWVzKGFzLm51bWVyaWMocHJlZGljdGlvbnMpLCBsYWJzKQpjb2xzIDwtIHJldihjKCJkYXJrZ3JlZW4iLCAicmVkIiwgImJsdWUiLCAiZGFya29yYW5nZTEiKSkKYmFycGxvdChwcmVkLCBjb2wgPSBjb2xzLCB5bGFiID0gIlByb2FiaWxpdHkiLCBjZXgubGFiID0gMywgY2V4Lm5hbWVzID0gMikKZGV2Lm9mZigpCmBgYAoKIVtdKFByb2JfYXVzLnBuZykKCgpgYGB7cn0KIyBQbG90IGNvbmZ1c2lvbiBtYXRyaXgKcG5nKCJDb25mZnVzaW9uX21hdHJpeF9hbGwucG5nIiwgd2lkdGggPSAyNSwgaGVpZ2h0ID0gMjUsIHJlcz0zMDAsIHVuaXRzPSJpbiIpCnBhcihtYXIgPSBjKDEwLCAxMSwgMSwgMSkpCmNvbG9yczEgPC0gY29sb3JSYW1wUGFsZXR0ZShjb2xvcnMgPSBjKCIjZjBmMGYwIiwgIiNiZGJkYmQiLCIjNjM2MzYzIikpCnByb3AgPC0gYXBwbHkoZml0JGNvbmZ1c2lvblssIC01XSwgMiwgZnVuY3Rpb24oeCl7eCAvIHN1bSh4KX0pICogMTAwCgppbWFnZShwcm9wLCBjb2wgPSBjb2xvcnMxKDIwKSwgYXhlcz1GQUxTRSkKYXhpcygxLCBhdD1jKDAsIC4zMywgLjY2LCAxKSwgbGFiZWxzPWxhYnMsIHRpY2sgPSBGQUxTRSwgbGluZSA9IEZBTFNFLCBjZXguYXhpcyA9IDMuNSwgcG9zID0gLS4xOSkKYXhpcygyLCBhdD1jKDAsIC4zMywgLjY2LCAxKSwgbGFiZWxzPWxhYnMsIHRpY2sgPSBGQUxTRSwgbGluZSA9IEZBTFNFLCBjZXguYXhpcyA9IDMuNSkKbXRleHQoIkFDVFVBTCIsIHNpZGUgPSAxLCBwYWRqID0gMywgY2V4ID0gNCkKbXRleHQoIlBSRURJQ1RFRCIsIHNpZGUgPSAyLCBwYWRqID0gLTMsIGNleCA9IDQpCgpmb3IoaSBpbiAxOjQpIHsKICBmb3IoaiBpbiAxOjQpIHsKICAgIHRleHQoeCA9IGMoMCwgLjMzLCAuNjYsIDEpW2ldLCB5ID0gYygwLCAuMzMsIC42NiwgMSlbal0sIHBhc3RlMChyb3VuZChwcm9wW2ksIGpdLCAyKSwgIiUiKSwKICAgICAgICAgY2V4ID0gNSkKICB9Cn0KZGV2Lm9mZigpCmBgYAoKCiFbXShDb25mZnVzaW9uX21hdHJpeF9hbGwucG5nKQoKCmBgYHtyfQppbXBvcnRhbmNlKGZpdCkKYGBgCgoKYGBge3J9CiMgVmFyaWFibGVzIGltcG9ydGFuY2UKCmltcCA8LSBpbXBvcnRhbmNlKGZpdCkKaW1wIDwtIGFwcGx5KGltcCwgMiwgZnVuY3Rpb24oeCkgKHggLSBtaW4oeCkpLyhtYXgoeCkgLSBtaW4oeCkpKQppbXAgPC0gaW1wW3NvcnQoaW1wWywgNV0sIGluZGV4LnJldHVybiA9IFRSVUUsIGRlY3JlYXNpbmcgPSBUUlVFKSRpeCwgXQoKCm5hbWVzIDwtIHJvd25hbWVzKGltcCkKbmFtZXNbbmFtZXMgPT0gInNwYXRpYWwudGVzdHMuZm9yYSJdIDwtICJTcGFjZSBGIgpuYW1lc1tuYW1lcyA9PSAic3BhdGlhbC50ZXN0cy5kb20iXSA8LSAiU3BhY2UgRCIKbmFtZXNbbmFtZXMgPT0gInNwcmF0ZSJdIDwtICJTcChyYXRpbykiCm5hbWVzW25hbWVzID09ICJ0cmFuc2l0aW9uX2Zyb21fdHJhaXRfMV90b18yIl0gPC0gIlRSKDEtMikiCm5hbWVzW25hbWVzID09ICJ0cmFuc2l0aW9uX2Zyb21fdHJhaXRfMl90b18xIl0gPC0gIlRSKDItMSkiCm5hbWVzW25hbWVzID09ICJQaHlsb2dlbmV0aWNfc2lnbmFsIl0gPC0gIlBoeVNpZyhEKSIKbmFtZXNbbmFtZXMgPT0gIkV2b2x1dGlvbmFyeV9kaXN0aW5jdGl2ZW5lc3Nfc3VtIl0gPC0gIkVEc3VtIgpuYW1lc1tuYW1lcyA9PSAiUHlsb19kaXZlcnNpdHlfaXNfc3VtX29mX0JMIl0gPC0gIlBEc3VtIgpuYW1lc1tuYW1lcyA9PSAidHJhbnNpdGlvbl9yYXRlX3JhdGlvXzF0bzJfb3Zlcl8ydG8xIl0gPC0gIlRSKHJhdGlvKSIKbmFtZXNbbmFtZXMgPT0gImdhbW1hIl0gPC0gIkdhbW1hIgpuYW1lc1tuYW1lcyA9PSAibWVhbl9QaHlsb2dlbmV0aWNfaXNvbGF0aW9uIl0gPC0gIk1QSSIKbmFtZXNbbmFtZXMgPT0gImV4dHJhdGUiXSA8LSAiRXh0KHJhdGlvKSIKbmFtZXNbbmFtZXMgPT0gImF2ZXJhZ2VfcGh5bG9nZW5ldGljX2RpdmVyc2l0eV9pc19tZWFuX29mX0JMIl0gPC0gIlBEbWVhbiIKbmFtZXNbbmFtZXMgPT0gImV4dGluY3Rpb25fcGVyX3NwZWNpYXRpb24iXSA8LSAiRFIiCm5hbWVzW25hbWVzID09ICJ2YXJpYW5jZV9QaHlsb2dlbmV0aWNfaXNvbGF0aW9uIl0gPC0gIlZQSSIKbmFtZXNbbmFtZXMgPT0gIkZfcXVhZHJhdGljX2VudHJvcHlfaXNfc3VtX29mX1BEIl0gPC0gIkYiCm5hbWVzW25hbWVzID09ICJNZWFuX3BhaXJ3aXNlX2Rpc3RhbmNlIl0gPC0gIk1QRCIKbmFtZXNbbmFtZXMgPT0gInZhcmlhbmNlX1B5bG9fZGl2ZXJzaXR5X2lzX3ZhcmlhbmNlX29mX0JMIl0gPC0gIlBEdmFyIgpuYW1lc1tuYW1lcyA9PSAidmFyaWFuY2VfcGFpcndpc2VfZGlzdGFuY2UiXSA8LSAiVlBEIgoKCnBuZygidmFyX2ltcG9ydF9hbGwucG5nIiwgd2lkdGggPSAyNSwgaGVpZ2h0ID0gMjUsIHVuaXQ9ImluIiwgcmVzPTMwMCkKcGFyKG1hciA9IGMoMTAsIDE4LCAxLCAxKSkKcGxvdCh4ID0gcmV2KGltcFssIDVdKSwgeSA9IDE6bnJvdyhpbXApLCB0eXBlID0gImwiLCB5YXh0ID0gIm4iLCAKICAgICB5bGFiID0gIiIsIHhsYWIgPSAiVmFyaWFibGUgSW1wb3J0YW5jZSIsCiAgICAgeGxpbSA9IGMoMCwgMSksIGx3ZCA9IDIsIGNleC5sYWIgPSA0KQpmb3IgKGkgaW4gMTpucm93KGltcCkpIHsKICBhYmxpbmUoaCA9IGksIGx0eSA9IDMsIGNvbCA9ICJncmF5ODAiKQp9CmFibGluZSh2ID0gc2VxKDAsIDEsIDEvMTkpLCBsdHkgPSAzLCBjb2wgPSAiZ3JheTgwIikKCmxpbmVzKHggPSByZXYoaW1wWywgNF0pLCB5ID0gMTpucm93KGltcCksIGNvbCA9ICJkYXJrZ3JlZW4iLCBsd2QgPSAyKQpsaW5lcyh4ID0gcmV2KGltcFssIDNdKSwgeSA9IDE6bnJvdyhpbXApLCBjb2wgPSAicmVkIiwgbHdkID0gMikKbGluZXMoeCA9IHJldihpbXBbLCAyXSksIHkgPSAxOm5yb3coaW1wKSwgY29sID0gImJsdWUiLCBsd2QgPSAyKQpsaW5lcyh4ID0gcmV2KGltcFssIDFdKSwgeSA9IDE6bnJvdyhpbXApLCBjb2wgPSAiZGFya29yYW5nZTEiLCBsd2QgPSAyKQpsaW5lcyh4ID0gcmV2KGltcFssIDVdKSwgeSA9IDE6bnJvdyhpbXApLCBsd2QgPSAzKQoKcG9pbnRzKHggPSByZXYoaW1wWywgNF0pLCB5ID0gMTpucm93KGltcCksIGNvbCA9ICJkYXJrZ3JlZW4iLCBjZXggPSAyKQpwb2ludHMoeCA9IHJldihpbXBbLCAzXSksIHkgPSAxOm5yb3coaW1wKSwgY29sID0gInJlZCIsIGNleCA9IDIpCnBvaW50cyh4ID0gcmV2KGltcFssIDJdKSwgeSA9IDE6bnJvdyhpbXApLCBjb2wgPSAiYmx1ZSIsIGNleCA9IDIpCnBvaW50cyh4ID0gcmV2KGltcFssIDFdKSwgeSA9IDE6bnJvdyhpbXApLCBjb2wgPSAiZGFya29yYW5nZTEiLCBjZXggPSAyKQpwb2ludHMoeCA9IHJldihpbXBbLCA1XSksIHkgPSAxOm5yb3coaW1wKSwgcGNoID0gMjAsIGNleCA9IDMpCgoKdGV4dCh5ID0gMTpucm93KGltcCksIHggPSBwYXIoInVzciIpWzFdIC0gLjE3LCBsYWJlbHMgPSByZXYobmFtZXMpLAogICAgIHNydCA9IDAsIHBvcyA9IDQsIHhwZCA9IFQsIGNleCA9IDQpCmRldi5vZmYoKQpgYGAKCiFbXSh2YXJfaW1wb3J0X2FsbC5wbmcpCgoKCgpgYGB7cn0KcGFyKG1mcm93PWMoMiwzKSkKCiMgQm94IHBsb3RzCmJveHBsb3Qoc3BhdGlhbC50ZXN0cy5mb3JhIH4gTW9kZWwsIGRhdGEgPSBkYXRhLmFuYWx5c2lzLmNvbXAzKQphYmxpbmUoaCA9IGEkc3BhdGlhbC50ZXN0cy5mb3JhLCBjb2wgPSAicmVkIiwgbHR5ID0gMikKCmJveHBsb3Qoc3BhdGlhbC50ZXN0cy5kb20gfiBNb2RlbCwgZGF0YSA9IGRhdGEuYW5hbHlzaXMuY29tcDMpCmFibGluZShoID0gYSRzcGF0aWFsLnRlc3RzLmZvcmEsIGNvbCA9ICJyZWQiLCBsdHkgPSAyKQoKYm94cGxvdChsb2coc3ByYXRlKSB+IE1vZGVsLCBkYXRhID0gZGF0YS5hbmFseXNpcy5jb21wMywgeWxpbSA9IGMoLTEwLCAxMCkpCmFibGluZShoID0gbG9nKGEkc3ByYXRlKSwgY29sID0gInJlZCIsIGx0eSA9IDIpCgpib3hwbG90KGxvZyhleHRyYXRlKSB+IE1vZGVsLCBkYXRhID0gZGF0YS5hbmFseXNpcy5jb21wMywgeWxpbSA9IGMoLTEwLCAxMCkpCmFibGluZShoID0gbG9nKGEkZXh0cmF0ZSksIGNvbCA9ICJyZWQiLCBsdHkgPSAyKQoKYm94cGxvdChsb2codHJhbnNpdGlvbl9yYXRlX3JhdGlvXzF0bzJfb3Zlcl8ydG8xKSB+IE1vZGVsLCBkYXRhID0gZGF0YS5hbmFseXNpcy5jb21wMykKYWJsaW5lKGggPSBsb2coYSRzcHJhdGUpLCBjb2wgPSAicmVkIiwgbHR5ID0gMikKCmJveHBsb3QoUGh5bG9nZW5ldGljX3NpZ25hbCB+IE1vZGVsLCBkYXRhID0gZGF0YS5hbmFseXNpcy5jb21wMywgeWxpbSA9IGMoMCwgMSkpCmFibGluZShoID0gYSRQaHlsb2dlbmV0aWNfc2lnbmFsLCBjb2wgPSAicmVkIiwgbHR5ID0gMikKCgpgYGAKCgoK